package com.atguigu.teach.mytask;

import java.util.concurrent.TimeUnit;

//资源类
class Phone{
    public static   synchronized void sendEmail(){
        try { TimeUnit.SECONDS.sleep(4); } catch (InterruptedException e) { e.printStackTrace(); }
        System.out.println("---Email");
    }
    public   synchronized void sendsms(){
        System.out.println("---SMS");
    }
    public  void hello(){
        System.out.println("---hello");
    }
}
/**
 * @author zxb
 * 1 标准访问，请问是先打印邮件还是短信
 * 2 发邮件耗费4秒，先打印邮件还是短信
 * 1-2 一个对象里面如果有多个synchronized方法，某一时刻，只要一个线程去调用一个synchronized方法了其他线程都只能等待，
 * 换句话说，某一时刻内的，只能有唯一一个线程去访问这些synchronized方法，锁的是当前对象this,
 * 被锁后，其他的线程都不能进入当前对象的其他synchronized方法
 * 3 新增普通hello方法，请问先打印邮件还是短信
 * 普通方法不需要抢锁，先到先得，直接运行了
 * 4 两部手机，请问先打印邮件还是短信
 * 各回各家各找各妈
 * 5 静态同步方法1部手机，先邮件还是短信
 * 静态同步方法锁的类
 * 6 静态同步方法2部手机，先邮件还是短信
 * 7 一个静态同步方法，一个普通同步方法，1部手机，先邮件还是短信
 * 8 一个静态同步方法，一个普通同步方法，2部手机，先邮件还是短信
 * 当一个线程试图访问同步代码时首先它必须得到锁，退出或者抛出异常时释放锁
 * 所有普通同步方法都是用一把锁--实例对象本身，就是new出来的具体实例对象本身
 * 可是别的实例对象的同步方法因为跟该实例对象的普通同步方法是不同的锁，所以不用等待该实例对象以获取锁的普通同步方法
 * 释放锁就可以获取他们自己的锁
 *
 * 所有的静态同步方法用的也是同一把锁--类对象本身，就是我们说过的唯一模板class,具体实例对象this和唯一模板class,
 * 这两把锁两个不同的对象，所以静态资源同步方法和普通同步方法直接不会有竞争条件的。但是一旦一个静态同步方法获取
 * 锁之后。其他的静态同步方法必须等待该方法释放锁之后才能获取锁
 */
public class MyLock8 {
/*    //1普通同步方法
    public synchronized void m1(){

    }
    //2同步代码块
    Object object=new Object();
    public void m2(){
        synchronized (object){

        }
    }
    //3静态同步方法
    public static synchronized  void m3(){

    }*/

    public static void main(String[] args) {
        Phone phone1 = new Phone();
        Phone phone2 = new Phone();
        new Thread(()->{phone1.sendEmail();},"t1").start();
        try { TimeUnit.MILLISECONDS.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); }
        new Thread(()->{
             // phone1.sendsms();
            phone2.sendsms();
            //phone2.sendsms();
            // phone1.sendsms();
            //phone2.sendsms();
            //phone1.sendsms();
             //phone2.sendsms();
            },"t2").start();

    }
}
